home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / Apps / DevTools / eText5 / Source / eTAudio.subproj / eTAudio.m < prev    next >
Encoding:
Text File  |  1995-02-04  |  6.9 KB  |  218 lines

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //    FILENAME:    eTAudio.m
  3. //    SUMMARY:    Implementation of Audio annotations to eText documents
  4. //    SUPERCLASS:    eTAudio:eTImage:Object
  5. //    INTERFACE:    None
  6. //    PROTOCOLS:    <DocNotification, Annotation, Tool, ASCIISupport, HTMDSupport,
  7. //                LaTeXSupport, eTAudioNotification, InspectableTarget>
  8. //    AUTHOR:        Rohit Khare
  9. //    COPYRIGHT:    (c) 1994 California Institure of Technology, eText Project
  10. ///////////////////////////////////////////////////////////////////////////////
  11. //    IMPLEMENTATION COMMENTS
  12. //        There is a delicate ballet of timings, displays, and messages betwixt
  13. //    self, inspector panel, sound view, sound meter, sound, and delegate
  14. //    messages all around.
  15. ///////////////////////////////////////////////////////////////////////////////
  16. //    HISTORY
  17. //    10/30/94:    Modified to support <InspectableTarget>
  18. //    07/24/94:    Rewritten for PR1 release/eTImage
  19. //  07/07/94:    Rewritten as a subclass of ImageAnnotation
  20. //    06/18/94:    HTMDSupport. RK & TRZ.
  21. //    01/24/94:    Created. Derived largely from Version3's temporary Hypertext
  22. //                '93 hack. Renamed as eTAudio and eTAudioUI.
  23. ///////////////////////////////////////////////////////////////////////////////
  24.  
  25. #import "eTAudio.h"
  26. #define _eTAudioVERSION    10
  27.  
  28. @implementation eTAudio
  29. //    id    etAudioComponent;
  30. /////////////////////////
  31. - sound {return [etAudioComponent theSound];}
  32. - (BOOL)isAudioMutable{return [etAudioComponent isMutable];}
  33. - (BOOL)isAudioLinked{return [etAudioComponent isLinked];}
  34. - (const char*)audioName {return [etAudioComponent componentName];}
  35. - setAudioName:(const char*) newName
  36.     {return [etAudioComponent setComponentName:NXUniqueString(newName)];}
  37. - setAudioDelegate:(id <eTAudioNotification>) newDelegate
  38.     {audioDelegate = newDelegate; return self;}
  39. - audioDelegate    {return audioDelegate;}
  40. /////////////////////////
  41. - audioStarted 
  42.     {[audioDelegate audioStarted]; return [self setState:YES];}
  43. - audioPaused                 // it would be cool to "dim" the speaking icon...
  44.     {[audioDelegate audioPaused]; return self;}
  45. - audioResumed                 // and this would be the inverse brighten...
  46.     {[audioDelegate audioResumed]; return self;}
  47. - audioEnded 
  48.     {[audioDelegate audioEnded]; return [self setState:NO];}
  49. /////////////////////////
  50. + toolAwake:theApp
  51. {
  52.     [theApp   registerAnnotation: [eTAudio class] 
  53.                             name: "eTAudio"
  54.                     RTFDirective: "eTAudio"
  55.                        menuLabel: "Insert Audio..."
  56.                          menuKey: 'A'
  57.                         menuIcon: (NXImage *) nil];
  58.     [theApp registerType:NXSoundPboardType for:[eTAudio class]];
  59.     [theApp registerType:NXCreateFilenamePboardType("snd") for:[eTAudio class]];
  60.     [theApp registerType:NXCreateFilenamePboardType("au") for:[eTAudio class]];
  61.     [theApp registerType:NXCreateFileContentsPboardType("snd") for:[eTAudio class]];
  62.     [theApp registerType:NXCreateFileContentsPboardType("au") for:[eTAudio class]];
  63.     return self;
  64. }
  65.  
  66. - init
  67. {
  68.     [super init];
  69.     
  70.     [self setImageComponent:
  71.         [eTImageComponent newImageNamed:"eTAudioComponentIcon"]];    
  72.     [self setAltImageComponent:
  73.         [eTImageComponent newImageNamed:"eTAudioComponentIconH"]];
  74.     [self setUsesButtonStyle:NO];
  75.     [self setDraggable:YES];
  76.     etAudioComponent=nil;
  77.     return self;
  78. }
  79.  
  80. - free 
  81. {
  82.     etAudioComponent = [etAudioComponent free];
  83.     return self = [super free];
  84. }
  85. //////////////////////////////
  86. - initFromPboard:thePB inDoc:theDoc linked:(BOOL) linked
  87. {
  88.     [self init];
  89.     // we prevent super from executing initFromPboard, so we have to:
  90.     etDoc = theDoc;
  91.     theText = [[etDoc docUI] eTextObj]; // consistency checking
  92.     [etDoc registerNotification:self];
  93.     
  94.     if (!thePB) {
  95.         etAudioComponent = [[eTAudioComponent alloc] initInDoc:theDoc linked:NO];
  96.         return self;
  97.     }
  98.     etAudioComponent=[[eTAudioComponent alloc] initInDoc:theDoc linked:linked];
  99.     [etAudioComponent readComponentFromPboard:thePB];
  100.     return self;
  101. }
  102. #define eTAUDIO "eTAudioComponentIcon"
  103. #define eTAUDIO_GIF eTAUDIO".gif"
  104. - writeComponentToPath:(NXAtom)path inFormat:(int) theFormat
  105. {
  106.     const char *name;
  107.     
  108.     if(!etDoc)    NXLogError("etDoc is nil at %s %u",__FILE__,__LINE__);
  109.     name = [[imageComponent theImage] name];
  110.     if ((theFormat == HTMD_FMT) && 
  111.         name && !strcmp(name,eTAUDIO)) {
  112.         char cmd[2*MAXPATHLEN];
  113.  
  114.         sprintf(cmd,"%s/"eTAUDIO_GIF, [[NXBundle mainBundle] directory]);
  115.         if (!access(cmd, F_OK|R_OK)) {
  116.              sprintf(cmd,"cp -rp \"%s/"eTAUDIO_GIF"\" \"%s/"eTAUDIO_GIF"\"", [[NXBundle mainBundle] directory], path);
  117.              system(cmd);
  118.             [etDoc registerComponent:eTAUDIO_GIF];
  119.         } else {
  120.             [super writeComponentToPath:path inFormat:theFormat];
  121.         }
  122.     } else 
  123.         [super writeComponentToPath:path inFormat:theFormat];
  124.     [etAudioComponent writeComponentToPath:path inFormat:theFormat];
  125.     return self;
  126. }
  127.  
  128. - addToPboard:pboard
  129. {
  130.     [etAudioComponent addToPboard:pboard];
  131.     return self;
  132. }
  133. - readRichText:(NXStream *)stream forView:view 
  134. {
  135.     int i;
  136.  
  137.     NXScanf(stream, "%d ", &i);
  138.     if (i != _eTAudioVERSION) {
  139.         // bad version block.
  140.         NXLogError("eTAudio found unparseable version %d at position %d",
  141.                     i, NXTell(stream));
  142.         return nil;
  143.     }
  144.     [super readRichText:stream forView:view];
  145.     NXGetc(stream); // separating space
  146.     etAudioComponent = [[[eTAudioComponent alloc] initInDoc:etDoc linked:NO] readRichText:stream forView:view];
  147.     return self;
  148. }
  149.  
  150. - writeRichText:(NXStream *)stream forView:view
  151. {    
  152.     NXPrintf(stream, "%d ", _eTAudioVERSION); 
  153.     [super writeRichText:stream forView:view];
  154.     NXPutc(stream, ' ');    // separate the two visually
  155.     [etAudioComponent writeRichText:stream forView:view];
  156.     return self;
  157. }
  158.  
  159. - writeASCIIRef:(NXStream *)stream forView:view
  160. {
  161.     NXPrintf(stream, "The audio annotation %y (last known address:%s)\n\t", [etAudioComponent componentName], [etAudioComponent currentPath]);
  162.     [super writeASCIIRef:stream forView:view];
  163.     return self;
  164. }
  165.  
  166. - writeLaTeX:(NXStream*)stream forView:view
  167. {    
  168.     [super writeLaTeX:stream forView:view];
  169.     [etAudioComponent writeLaTeX:stream forView:view];
  170.     return self;
  171. }
  172.  
  173. - writeHTML:(NXStream *)stream forView:view
  174. {         
  175.     [etAudioComponent writeHTML:stream forView:view andClose:NO];
  176.     [super writeHTML:stream forView:view];
  177.     NXPrintf(stream,"</A>");
  178.     return self;
  179. }
  180.  
  181. //////////////////////////////
  182. // the "delegate" calls below explicitly assume that inspect is called
  183. // _before_ click or double-click. (this is indeed done by eTImage).
  184. // (it is safe though -- nothing will happen)
  185. - click:(NXEvent*)e 
  186.     {return [[eTAudioUI new] click:self];}
  187. - doubleClick:(NXEvent*)e 
  188.     {return [[eTAudioUI new] doubleClick:self];}
  189. - inspect:(NXEvent *) e
  190.     {return [[NXApp inspector] inspect:self];}
  191. - (id <Inspectable>) inspectableDelegate {
  192.     return [[eTAudioUI new] setAnnotation:self]; }
  193.  
  194. - drag: (Pasteboard *)draggingPboard image:(NXImage **)proxyImage
  195. {
  196.     if (! etAudioComponent) {
  197.         *proxyImage = nil;
  198.         return nil;
  199.     }
  200.     [etAudioComponent writeComponentToPboard:draggingPboard];
  201.     *proxyImage = [etAudioComponent icon];
  202.     return self;
  203. }
  204.  
  205. //////////////////////////////
  206. - setImageComponent:newImageComponent
  207. {
  208.     const char *name;
  209.     
  210.     name = [[newImageComponent theImage] name];
  211.     if (name && !strcmp(name,"eTAudioComponentIcon"))
  212.         usesButtonStyle = NO;
  213.     else
  214.         usesButtonStyle = YES;
  215.     return [super setImageComponent:newImageComponent];
  216. }
  217.  
  218. @end